package com.example.authsystem.controller;

import com.example.authsystem.dto.AuthDTO.*;
import com.example.authsystem.model.LoginStats;
import com.example.authsystem.service.AuthService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * 认证控制器类
 * 提供REST API端点处理用户认证相关的HTTP请求
 * 包括用户注册、登录、登出以及登录统计功能
 */
@RestController
@RequestMapping("/auth")
public class AuthController {

    /**
     * 认证服务，提供用户认证和登录统计的核心业务功能
     */
    @Autowired
    private AuthService authService;

    /**
     * 用户注册接口
     * 接收注册请求，创建新用户并返回JWT令牌
     * 
     * @param request 注册请求对象，包含用户名、密码和邮箱信息
     * @return 成功时返回AuthResponse对象，包含JWT令牌和用户信息；失败时返回错误信息
     */
    @PostMapping("/register")
    public ResponseEntity<?> register(@RequestBody RegisterRequest request) {
        try {
            // 调用认证服务进行用户注册
            AuthResponse response = authService.register(request);
            return ResponseEntity.ok(response);
        } catch (RuntimeException e) {
            // 处理注册异常，如用户名或邮箱已存在
            ErrorResponse errorResponse = new ErrorResponse();
            errorResponse.setMessage(e.getMessage());
            errorResponse.setStatusCode(400);
            return ResponseEntity.badRequest().body(errorResponse);
        }
    }

    /**
     * 用户登录接口
     * 验证用户凭证，生成JWT令牌并返回用户信息
     * 
     * @param request 登录请求对象，包含用户名和密码
     * @param httpRequest HTTP请求对象，用于获取客户端IP和用户代理信息
     * @return 成功时返回AuthResponse对象，包含JWT令牌和用户信息；失败时返回401未授权错误
     */
    @PostMapping("/login")
    public ResponseEntity<?> login(@RequestBody LoginRequest request, HttpServletRequest httpRequest) {
        try {
            // 调用认证服务进行用户登录
            AuthResponse response = authService.login(request, httpRequest);
            return ResponseEntity.ok(response);
        } catch (Exception e) {
            // 处理登录异常，如用户名或密码错误
            ErrorResponse errorResponse = new ErrorResponse();
            errorResponse.setMessage("Invalid username or password");
            errorResponse.setStatusCode(401);
            return ResponseEntity.status(401).body(errorResponse);
        }
    }

    /**
     * 用户登出接口
     * 处理用户登出请求，减少在线用户计数
     * 
     * @return 成功时返回登出成功消息
     */
    @PostMapping("/logout")
    public ResponseEntity<?> logout() {
        // 调用认证服务进行用户登出
        authService.logout();
        return ResponseEntity.ok("Logged out successfully");
    }

    /**
     * 获取今日登录人数统计接口
     * 返回从今天凌晨开始到当前时间的独立登录用户数量
     * 注：实际生产环境中应添加ADMIN权限控制
     * 
     * @return 今日登录人数统计信息
     */
    @GetMapping("/stats/today")
    public ResponseEntity<?> getTodayLoginCount() {
        // 调用认证服务获取今日登录人数
        Long count = authService.getTodayLoginCount();
        return ResponseEntity.ok("Today's login count: " + count);
    }

    /**
     * 获取当前在线人数接口
     * 返回当前系统中的在线用户数量
     * 注：实际生产环境中应添加ADMIN权限控制
     * 
     * @return 当前在线用户数量信息
     */
    @GetMapping("/stats/online")
    public ResponseEntity<?> getCurrentOnlineCount() {
        // 调用认证服务获取当前在线人数
        int count = authService.getCurrentOnlineCount();
        return ResponseEntity.ok("Current online users: " + count);
    }

    /**
     * 获取最近登录记录接口
     * 返回指定数量的最近登录记录列表
     * 注：实际生产环境中应添加ADMIN权限控制
     * 
     * @param limit 要获取的记录数量限制，默认为10
     * @return 最近登录记录列表
     */
    @GetMapping("/stats/recent")
    public ResponseEntity<List<LoginStats>> getRecentLoginRecords(@RequestParam(defaultValue = "10") int limit) {
        // 调用认证服务获取最近登录记录
        List<LoginStats> records = authService.getRecentLoginRecords(limit);
        return ResponseEntity.ok(records);
    }

    /**
     * 测试认证接口
     * 用于验证用户是否已成功通过认证
     * 
     * @return 认证成功消息
     */
    @GetMapping("/test")
    public ResponseEntity<?> test() {
        return ResponseEntity.ok("Authentication successful!");
    }
    
    /**
     * 公开测试接口
     * 跳过JWT权限校验，任何人都可以访问
     * 
     * @return 测试成功消息
     */
    @GetMapping("/test-public")
    public ResponseEntity<?> testPublic() {
        return ResponseEntity.ok("公共测试端点-无需身份验证！");
    }
}